/* Declarations for getopt.
   Copyright (C) 1989-1994,1996-1999,2001,2003,2004
   Free Software Foundation, Inc.
   This file is part of the GNU C Library.

   The GNU C Library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2.1 of the License, or (at your option) any later version.

   The GNU C Library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with the GNU C Library; if not, write to the Free
   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
   02111-1307 USA.  */

/* 
 * JoeM migrated it to Microsoft Windows platform from GPL Linux
 * At 2006-02-21.  
 */

#if _MSC_VER > 1000
#pragma once
#endif

#ifndef _INC_GETOPT_H
#define _INC_GETOPT_H

#ifndef _WIN32_WINNT 		// Allow use of features specific to Windows XP or later.                   
#define _WIN32_WINNT 0x0501	// Change this to the appropriate value to target other versions of Windows.
#endif

#include <tchar.h>

#ifdef __cplusplus
extern "C" {
#endif

/* For communication from 'getopt' to the caller.
    When 'getopt' finds an option that takes an argument,
    the argument value is returned here.
    Also, when 'ordering' is RETURN_IN_ORDER,
    each non-option ARGV-element is returned here. */
    extern TCHAR* optarg;

/* Index in ARGV of the next element to be scanned.
    This is used for communication to and from the caller
    and for communication between successive calls to 'getopt'.

    On entry to 'getopt', zero means this is the first call; initialize.

    When 'getopt' returns -1, this is the index of the first of the
    non-option elements that the caller should itself scan.

    Otherwise, 'optind' communicates from one call to the next
    how much of ARGV has been scanned so far. */
    extern int optind;

/* Callers store zero here to inhibit the error message 'getopt' prints
    for unrecognized options.  */
    extern int opterr;

/* Set to an option character which was unrecognized. */
    extern int optopt;

/* Describe the long-named options requested by the application.
    The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector
    of 'struct option' terminated by an element containing a name which is
    zero.

    The field 'has_arg' is:
    no_argument (or 0) if the option does not take an argument,
    required_argument (or 1) if the option requires an argument,
    optional_argument (or 2) if the option takes an optional argument.

    If the field 'flag' is not NULL, it points to a variable that is set
    to the value given in the field 'val' when the option is found, but
    left unchanged if the option is not found.

    To have a long-named option do something other than set an 'int' to
    a compiled-in constant, such as set a value from 'optarg', set the
    option's 'flag' field to zero and its 'val' field to a nonzero
    value (the equivalent single-letter option character, if there is
    one). For long options that have a zero 'flag' field, 'getopt'
    returns the contents of the 'val' field. */
    struct option {
        const TCHAR *name;
        enum {
            NO_ARGUMENT, 
            REQUIRED_ARGUMENT, 
            OPTIONAL_ARGUMENT} 
        has_arg;
        int *flag;
        int val;
    };

#ifdef WIN32
    extern int getopt(int, TCHAR* const *, const TCHAR*);
    extern int getopt_long(int, TCHAR* const *, const TCHAR *, const struct option *, int*);
    extern int getopt_long_only(int, TCHAR* const *, const TCHAR *, const struct option *, int*);
#endif

#ifdef __cplusplus
}
#endif

#endif /* _INC_GETOPT_H */
